package service

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
	"strconv"
	"strings"
	"time"
	
	"git-todo/model"
)

// TodoFileRepository 基于文件的Todo数据仓库实现
type TodoFileRepository struct {
	dataFile string
}

// NewTodoFileRepository 创建新的文件数据仓库
func NewTodoFileRepository() model.TodoRepository {
	// 获取用户主目录
	homeDir, err := os.UserHomeDir()
	if err != nil {
		fmt.Printf("获取用户主目录失败: %v\n", err)
		os.Exit(1)
	}
	
	// 创建数据目录
	dataDir := filepath.Join(homeDir, ".git-todo")
	if err := os.MkdirAll(dataDir, 0755); err != nil {
		fmt.Printf("创建数据目录失败: %v\n", err)
		os.Exit(1)
	}
	
	return &TodoFileRepository{
		dataFile: filepath.Join(dataDir, "todos.json"),
	}
}

// LoadTodos 加载所有待办事项
func (r *TodoFileRepository) LoadTodos() ([]model.TodoItem, error) {
	// 如果文件不存在，返回空列表
	if _, err := os.Stat(r.dataFile); os.IsNotExist(err) {
		return []model.TodoItem{}, nil
	}
	
	data, err := os.ReadFile(r.dataFile)
	if err != nil {
		return nil, fmt.Errorf("读取数据文件失败: %v", err)
	}
	
	var todos []model.TodoItem
	if err := json.Unmarshal(data, &todos); err != nil {
		return nil, fmt.Errorf("解析数据文件失败: %v", err)
	}
	
	return todos, nil
}

// SaveTodos 保存所有待办事项到存储
func (r *TodoFileRepository) SaveTodos(todos []model.TodoItem) error {
	data, err := json.MarshalIndent(todos, "", "  ")
	if err != nil {
		return fmt.Errorf("序列化数据失败: %v", err)
	}
	
	if err := os.WriteFile(r.dataFile, data, 0644); err != nil {
		return fmt.Errorf("写入数据文件失败: %v", err)
	}
	
	return nil
}

// GetTodosByBranch 根据分支获取所有未完成的待办事项
func (r *TodoFileRepository) GetTodosByBranch(branch string) ([]model.TodoItem, error) {
	allTodos, err := r.LoadTodos()
	if err != nil {
		return nil, err
	}
	
	var branchTodos []model.TodoItem
	for _, todo := range allTodos {
		if todo.Branch == branch && !todo.Completed {
			branchTodos = append(branchTodos, todo)
		}
	}
	
	return branchTodos, nil
}

// AddTodo 添加新的待办事项
func (r *TodoFileRepository) AddTodo(todo model.TodoItem) error {
	allTodos, err := r.LoadTodos()
	if err != nil {
		return err
	}
	
	// 设置创建时间
	todo.CreatedAt = time.Now()
	todo.Completed = false
	
	// 获取下一个ID
	nextID, err := r.GetNextID(todo.Branch)
	if err != nil {
		return err
	}
	todo.ID = nextID
	
	allTodos = append(allTodos, todo)
	return r.SaveTodos(allTodos)
}

// GetNextID 获取指定分支的下一个可用ID
func (r *TodoFileRepository) GetNextID(branch string) (int, error) {
	allTodos, err := r.LoadTodos()
	if err != nil {
		return 1, err
	}
	
	maxID := 0
	for _, todo := range allTodos {
		if todo.Branch == branch && todo.ID > maxID {
			maxID = todo.ID
		}
	}
	
	return maxID + 1, nil
}

// MarkTodoCompleted 根据ID或描述标记待办事项为完成
func (r *TodoFileRepository) MarkTodoCompleted(branch string, identifier string) error {
	allTodos, err := r.LoadTodos()
	if err != nil {
		return err
	}
	
	found := false
	
	// 尝试将identifier解析为ID
	if id, err := strconv.Atoi(identifier); err == nil {
		// 按ID查找
		for i := range allTodos {
			if allTodos[i].Branch == branch && allTodos[i].ID == id && !allTodos[i].Completed {
				allTodos[i].Completed = true
				found = true
				break
			}
		}
	} else {
		// 按描述查找（模糊匹配）
		for i := range allTodos {
			if allTodos[i].Branch == branch && !allTodos[i].Completed &&
				strings.Contains(strings.ToLower(allTodos[i].Description), strings.ToLower(identifier)) {
				allTodos[i].Completed = true
				found = true
				break
			}
		}
	}
	
	if !found {
		return fmt.Errorf("在分支 '%s' 中未找到匹配的待办事项: %s", branch, identifier)
	}
	
	return r.SaveTodos(allTodos)
}